package bank.gui;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import fontys.util.InvalidSessionException;
import fontys.util.NumberDoesntExistException;
import bank.bankieren.IRekening;
import bank.bankieren.Money;
import bank.internettoegang.IBalie;
import bank.internettoegang.IBankiersessie;
import bank.internettoegang.IRemoteListener;
import java.util.logging.Level;
import java.util.logging.Logger;

public class GuiController extends UnicastRemoteObject implements IRemoteListener{

	private static final long serialVersionUID = 1L;
	
	private IBalie balie; 
	private IBankiersessie sessie;
	//private IRemoteListener listener;
        
	private LoginDialoog loginDialoog;
	private OpenRekeningDialoog openDialoog;
	private BankiersessieDialoog bankierDialoog;
	
	
	public GuiController(IBalie balie,String bankNaam) throws RemoteException {
		this.balie = balie;
		loginDialoog = new LoginDialoog(this, bankNaam);
		loginDialoog.setVisible(true);
                
	}
	
	public void login(String accountnaam, String wachtwoord) {
		try {
			sessie = balie.logIn(accountnaam,wachtwoord); 
			if (sessie == null) {
			    loginDialoog.setMessage("accountname or password not correct /n");
			}
			else {
				loginDialoog.dispose();
				bankierDialoog = new BankiersessieDialoog(this);
				bankierDialoog.setVisible(true);
				System.out.println(accountnaam+" "+wachtwoord);
                                balie.addListener(this);
			}
		} catch (Exception e1) {
			loginDialoog.setMessage("bad connection with counter");
			e1.printStackTrace();
		}
	} 		
			
	public void openRekening(String naam, String plaats, String wachtwoord){
	    String accountname = "";
		try {
			accountname = balie.openRekening(naam, plaats, wachtwoord);
                        System.out.println(accountname);
		if (accountname == null) 
                {
		    System.out.println("no new account");
                    return;
                }
                
		} catch (Exception e1) {
			e1.printStackTrace();
		}
                loginDialoog.setAccountname(accountname);
		openDialoog.dispose();
	}
	
	public void logUit() {
		try {
			sessie.logUit();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
		
	public void maakOver(int bestemming, Money bedrag) {
             
		try{
			boolean success = balie.lokaalOpdracht(sessie.getRekening().getNr(),bestemming, bedrag);
                        System.out.println("excecute: "+success);
                        //listener.update(sessie.getRekening().getNr(), bestemming);
                        if (success)
                            update(sessie.getRekening().getNr(), sessie.getRekening().getSaldo().toString());
		} catch (RemoteException e1) {
			e1.printStackTrace();
			bankierDialoog.setMessage("verbinding verbroken");
                        System.out.println("verbinding verbroken");
//		} catch (NumberDoesntExistException e1) {
//			e1.printStackTrace();
//			bankierDialoog.setMessage(e1.getMessage());
//                        System.out.println("NumberDoesntExistException");
		} catch (InvalidSessionException e1) {
			e1.printStackTrace();
			bankierDialoog.setMessage(e1.getMessage());
                        System.out.println("InvalidSessionException");
		}
                
	}

	public IRekening getRekening() {
		try{
			return sessie.getRekening();
		} catch (RemoteException e) {
			e.printStackTrace();
			bankierDialoog.setMessage("verbinding verbroken");
			return null; 
		} catch (InvalidSessionException e) {
			e.printStackTrace();
			bankierDialoog.setMessage("bankiersessie is verlopen");
			return null; 
		}
	}

	public void openRekeningDialoog() {
		this.openDialoog = new OpenRekeningDialoog(this);
		openDialoog.setVisible(true);		
	}

        public BankiersessieDialoog getBankierDialoog(){
            return bankierDialoog;
        }
        

    public void update(int rekeningNr, String newval) throws RemoteException
    {
        try {
            if (sessie.getRekening().getNr() == rekeningNr) {
                bankierDialoog.setBalance(newval);
                System.out.println("updating gui with" + newval);
            }
        } catch (InvalidSessionException ex) {
            Logger.getLogger(GuiController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RemoteException ex) {
            Logger.getLogger(GuiController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

